

// macro_rules_designators

/*
The arguments of a macro are prefixed by a dollar sign $ and type annotated with a designator:
一个宏的参数的前缀是一个美元符号$和类型注释了一个指示器:
*/

macro_rules! create_function {
    // This macro takes an argument of designator `ident` and
    // creates a function named `$func_name`.
    // The `ident` designator is used for variable/function names.
    ($func_name:ident) => (
        fn $func_name() {
            // The `stringify!` macro converts an `ident` into a string.
            println!("You called {:?}()",
                     stringify!($func_name));
        }
    )
}

// Create functions named `foo` and `bar` with the above macro.
create_function!(foo);
create_function!(bar);

macro_rules! print_result {
    // This macro takes an expression of type `expr` and prints
    // it as a string along with its result.
    // The `expr` designator is used for expressions.
    ($expression:expr) => (
        // `stringify!` will convert the expression *as it is* into a string.
        println!("{:?} = {:?}",
                 stringify!($expression),
                 $expression);
    )
}

pub fn test_fn() {
    foo();
    bar();

    print_result!(1u32 + 1);

    // Recall that blocks are expressions too!
    print_result!({
        let x = 1u32;

        x * x + 2 * x - 1
    });
}

/*
This is a list of all the designators:
以下是所有指示符的列表:
    block
    expr is used for expressions 用于表达式
    ident is used for variable/function names用户函数变量
    item
    pat (pattern) 匹配 模式
    path
    stmt (statement) 语句 声明
    tt (token tree) 令牌书
    ty (type) 类型

*/